using System;
using System.Collections;
using Server.Targeting;
using Server.Network;

namespace Server.Mobiles
{
	public class BerserkAI : BaseAI
	{
		public BerserkAI(BaseCreature m) : base (m)
		{
		}
	
		public override bool DoActionWander()
		{
			m_Mobile.DebugSay( "I have No Combatant" );
			
			if( AcquireFocusMob( m_Mobile.RangePerception, FightMode.Closest, false, true, true) )
			{
				if ( m_Mobile.Debug )
					m_Mobile.DebugSay( "I have detected " + m_Mobile.FocusMob.Name + " and I will attack" );

				m_Mobile.Combatant = m_Mobile.FocusMob;
				Action = ActionType.Combat;
			}			
			else
			{
				base.DoActionWander();
			}

			return true;			
		}
			
		public override bool DoActionCombat()
		{
			if( m_Mobile.Combatant == null || m_Mobile.Combatant.Deleted )
			{
				m_Mobile.DebugSay("My combatant is deleted");
				Action = ActionType.Guard;
				return true;
			}

			if( WalkMobileRange( m_Mobile.Combatant, 1, true, m_Mobile.RangeFight, m_Mobile.RangeFight ) )
			{
				// Be sure to face the combatant
				m_Mobile.Direction = m_Mobile.GetDirectionTo( m_Mobile.Combatant.Location );
			}
			else
			{
				if( m_Mobile.Combatant != null )
				{
					if ( m_Mobile.Debug )
						m_Mobile.DebugSay("I am still not in range of " + m_Mobile.Combatant.Name);

					if( (int) m_Mobile.GetDistanceToSqrt( m_Mobile.Combatant ) > m_Mobile.RangePerception + 1 )
					{
						if ( m_Mobile.Debug )
							m_Mobile.DebugSay( "I have lost " + m_Mobile.Combatant.Name );

						Action = ActionType.Guard;
						return true;
					}
				}
			}
			
			return true;
		}
		
		public override bool DoActionGuard()
		{
			if ( AcquireFocusMob(m_Mobile.RangePerception, m_Mobile.FightMode, false, true, true ) )
			{
				if ( m_Mobile.Debug )
					m_Mobile.DebugSay( "I have detected {0}, attacking", m_Mobile.FocusMob.Name );

				m_Mobile.Combatant = m_Mobile.FocusMob;
				Action = ActionType.Combat;
			}
			else
			{
				base.DoActionGuard();
			}

			return true;
		}
	}
}
